UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码

您所在的位置:网站首页 un 是什么单位 UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码

UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码

2023-12-06 19:25| 来源: 网络整理| 查看: 265

目录

Python代码

根据需求改写url

报错应对办法

UN Comtrade数据库关于中国台湾的数据

2021/9/28更新:最近有用户反馈下载会出现错误内容如下图,感谢用户@三眼皮138帮忙找出错误。官方应该是更新API的使用了,在爬取数据是将url中的关键词max放到最前面即可避免错误,以下代码都已经更新。

以下为原文:

最近需要从UN Comtrade数据库下载一批数据,2003-2019年各国进口产品金额,产品类别使用SITC3分类标准,打算按年份分17次下载,结果提示普通用户单次最大下载量为10000,所以只能将Reporters分别选中每个国家下载,这样一共要下载256*17次,并不现实。借助UN Comtrade提供的API,写了一份代码自动下载数据。

(该数据已经下载好了,需要可以留下邮箱。如果急需其他数据或者代码使用困难,也可私信我帮忙代下、对数据筛选处理等。)

Python代码

具体代码如下。经过测试,windows系统和linux系统都可以拷贝到本地直接用python3.x运行。如果需要下载其他数据,更换代码里的url链接的参数即可,url的格式参考官方说明Data API (v2) | UN Comtrade: International Trade Statistics,下一段也进行了简单说明。

# -*- coding: utf-8 -*- import json import urllib.request from random import randint import time import os USER_AGENTS = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52", ] def download_url(url, path, header): """ 函数功能:下载url链接内容到path路径下 参数解释: url: 下载链接 path: 本地保存路径 header: 设置访问用户代理 """ content = urllib.request.Request(url, headers=header) with urllib.request.urlopen(content) as file: with open(path,'wb') as outfile: outfile.write(file.read()) def main(): random_agent = USER_AGENTS[randint(0, len(USER_AGENTS)-1)] header = {'User-Agent':random_agent} #-----------------获取所有国家的名单和国家对应编码号----------------- if not os.path.exists("./reporterAreas.json"): download_url("https://comtrade.un.org/Data/cache/reporterAreas.json","./reporterAreas.json",header) with open('reporterAreas.json', 'r',encoding='utf_8_sig') as f: data = json.load(f) results = data.get("results") id = [] #存放国家编码号 text = [] #存放国家名称 for i in results: id.append(i.get("id")) text.append(i.get("text")) # 删除第一个元素,第一个元素是all new_id = id[1:] new_text = text[1:] #------------------------------------------------------------------ # 若运行中断,继续下载仅需要更改下面三个参数 start_year = 2003 stop_year = 2019 begin_id = 0 #当前年份已下载文件数目 # 创建data文件夹存放下载数据 if not os.path.exists("./data"): os.makedirs("./data") for year in range(start_year, stop_year+1): # 创建年份文件夹将数据按年份分开存放 if not os.path.exists("./data/" + str(year)): os.makedirs("./data/" + str(year)) for i in range(begin_id, len(new_id)): random_agent = USER_AGENTS[randint(0, len(USER_AGENTS)-1)] print(random_agent) header = {'User-Agent':random_agent} url = "http://comtrade.un.org/api/get?max=100000&r=" + str(new_id[i]) + "&freq=A&ps=" + str(year) + "&px=S3&p=0&rg=1&cc=AG3&fmt=csv&type=C" path = "./data/" + str(year) + "/" + new_text[i] + ".csv" print("Downing from " + url + " to " + path) download_url(url,path,header) print("Done") # 暂停36秒,保证一小时访问100次 time.sleep(36) if __name__ == '__main__': main() 根据需求改写url

url的格式为http://comtrade.un.org/api/get?parameters,其中parameters每个变量含义:

r:reportering area,选择所需要的目标国家;

freq:选择数据为年度或月度;

ps:选择所需要的年份;

px:选择分类标准,如常用的SITC Revision 3为S3;

p:partner area,选择所需要的对象国家,如需要中国与俄罗斯的出口额,则目标为中国,对象为俄罗斯;

rg:选择进口或出口;

cc:选择产品代码;

fmt:选择输出文件格式,csv或json;

max:最大返回数据量;

type:选择贸易类型,产品或服务。

举例:“中国2015年与其他国家或地区在SITC Rev.3标准下所有3位编码产品进口总额”

对应的url为“http://comtrade.un.org/api/get?max=100000&r=156&freq=A&ps=2015&px=S3&p=0&rg=1&cc=AG3&fmt=csv&type=C”。(直接点击跳转就可以下载)

报错应对办法

运行过程中会遇到“RemoteDisconnected: Remote end closed connection without response”,“409 Conflict”等错误,参考【Python】py3.6请求网站时报错:http.client.RemoteDisconnected: Remote end closed connection without response使用更换User Agent的方法来避免同一用户频繁访问被限制,有一些作用但并不能避免错误继续产生。问题根源在UN Comtrade API使用的限制,网站明确说明了普通用户每小时只能发送100次请求,否则就会报409的错。所以将请求速度通过sleep函数限制到36秒一次,1小时100次,但依然会报409的错误。因此想要避免这个错误,就必须使用一些动态改变IP的方法,可以自行去搜索或参考本人另一篇博文UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码——使用动态IP。如果数据量不是特别大,一千次下载量以内,断断续续也是很快就可以下载完的,代码也有中断后继续下载的功能(修改起始年份和当前年份已下载文件数即可)。

UN Comtrade数据库关于中国台湾的数据

如果下载完数据仔细观察,会发现找不到台湾的数据,而香港(编号344,China,Hong Kong SAR)和澳门(编号446,China,Macao SAR)的数据是很容易找到的,SAR就是Special Administration Region 特别行政区的意思。其实台湾的数据就是编号490,Other Asia,nes(not elsewhere specified,他处未列的,不另详述)的数据。以2012,2013年UN Comtrade数据库内中国与Other Asia,nes进出口总额和中国统计年鉴数据库内中国与中国台湾进出口总额对比来说明。

UN Comtrade:

中国统计年鉴:

对比完应该就可以确定Other Asia,nes就是中国台湾,希望大家使用的时候能够注意这个问题。当然也便于解决和其他数据一起使用时的名称匹配问题,如UNCTAD(联合国贸易和发展会议)数据库就明确标出了中国台湾省(China,Taiwan Province)。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3